﻿#region (C) Header Region @ 2012
//====================================================
// 文件: Cryptography.cs
// 描述: 加密类（可以加密文件）
// 路径: Antu.Core\Utilities\Cryptography.cs
// ******************版本1 ******************
// 人员: 蔡金保    时间 : 2012/11/15 11:26:27
// 注释:
//====================================================
#endregion

using System;
using System.IO;
using System.Text;
using System.Security.Cryptography;

namespace Antu.Utilities
{
    /// <summary>
    /// 系统加密解密等处理类
    /// </summary>
    public class Cryptography
    {
        #region 私有属性
        /// <summary>
        /// 密钥字符串（8位）
        /// </summary>
        internal const string ENCRKEY = "$^&^|*:(";
        #endregion 私有域

        #region 静态方法
        #region 加密解密字符串
        /// <summary>
        /// 加密字符串
        /// </summary>
        /// <param name="strText">欲加密的字符串</param>
        /// <param name="strEncrKey">密钥（8位）</param>
        /// <returns>加密后的字符串</returns>
        public static string DesEncrypt( string strText , string strEncrKey )
        {
            byte[] byKey = null;
            byte[] IV = { 0x12 , 0x34 , 0x56 , 0x78 , 0x90 , 0xAB , 0xCD , 0xEF };
            try
            {
                byKey = System.Text.Encoding.UTF8.GetBytes( strEncrKey.Substring( 0 , 8 ) );
                DESCryptoServiceProvider des = new DESCryptoServiceProvider();
                byte[] inputByteArray = Encoding.UTF8.GetBytes( strText );
                MemoryStream ms = new MemoryStream();
                CryptoStream cs = new CryptoStream( ms , des.CreateEncryptor( byKey , IV ) , CryptoStreamMode.Write );
                cs.Write( inputByteArray , 0 , inputByteArray.Length );
                cs.FlushFinalBlock();
                return Convert.ToBase64String( ms.ToArray() );
            }
            catch ( System.Exception error )
            {
                throw ( error );
            }
        }
        /// <summary>
        /// 使用系统默认的密钥进行加密
        /// </summary>
        /// <param name="strText">欲加密的字符串</param>
        /// <returns></returns>
        public static string DesEncrypt( string strText )
        {
            return DesEncrypt( strText , ENCRKEY );
        }
        /// <summary>
        /// 解密字符串
        /// </summary>
        /// <param name="strText">欲解密的的字符串</param>
        /// <param name="sDecrKey">密钥（8位）</param>
        /// <returns>解密后的字符串</returns>
        public static string DesDecrypt( string strText , string sDecrKey )
        {
            byte[] byKey = null;
            byte[] IV = { 0x12 , 0x34 , 0x56 , 0x78 , 0x90 , 0xAB , 0xCD , 0xEF };
            byte[] inputByteArray = new Byte[strText.Length];
            try
            {
                byKey = System.Text.Encoding.UTF8.GetBytes( sDecrKey.Substring( 0 , 8 ) );
                DESCryptoServiceProvider des = new DESCryptoServiceProvider();
                inputByteArray = Convert.FromBase64String( strText );
                MemoryStream ms = new MemoryStream();
                CryptoStream cs = new CryptoStream( ms , des.CreateDecryptor( byKey , IV ) , CryptoStreamMode.Write );
                cs.Write( inputByteArray , 0 , inputByteArray.Length );
                cs.FlushFinalBlock();
                System.Text.Encoding encoding = new System.Text.UTF8Encoding();
                return encoding.GetString( ms.ToArray() );
            }
            catch ( System.Exception error )
            {
                throw ( error );
            }
        }
        /// <summary>
        /// 使用默认的密钥解密通过此默认密钥加密的数据
        /// </summary>
        /// <param name="strText"></param>
        /// <returns></returns>
        public static string DesDecrypt( string strText )
        {
            return DesDecrypt( strText , ENCRKEY );
        }
        #endregion 加密解密字符串

        #region 加密解密文件
        /// <summary>
        /// 加密文件
        /// </summary>
        /// <param name="m_InFilePath">欲加密文件的路径</param>
        /// <param name="m_OutFilePath">加密后的文件输出路径</param>
        /// <param name="strEncrKey">密钥（8位）</param>
        public static void DesEncryptFile( string m_InFilePath , string m_OutFilePath , string strEncrKey )
        {
            byte[] byKey = null;
            byte[] IV = { 0x12 , 0x34 , 0x56 , 0x78 , 0x90 , 0xAB , 0xCD , 0xEF };
            try
            {
                byKey = System.Text.Encoding.UTF8.GetBytes( strEncrKey.Substring( 0 , 8 ) );
                FileStream fin = new FileStream( m_InFilePath , FileMode.Open , FileAccess.Read );
                FileStream fout = new FileStream( m_OutFilePath , FileMode.OpenOrCreate , FileAccess.Write );
                fout.SetLength( 0 );

                //Create variables to help with read and write.
                byte[] bin = new byte[100]; //This is intermediate storage for the encryption.
                long rdlen = 0; //This is the total number of bytes written.
                long totlen = fin.Length; //This is the total length of the input file.
                int len; //This is the number of bytes to be written at a time.

                DES des = new DESCryptoServiceProvider();
                CryptoStream encStream = new CryptoStream( fout , des.CreateEncryptor( byKey , IV ) , CryptoStreamMode.Write );

                //Read from the input file, then encrypt and write to the output file.
                while ( rdlen < totlen )
                {
                    len = fin.Read( bin , 0 , 100 );
                    encStream.Write( bin , 0 , len );
                    rdlen = rdlen + len;
                }

                encStream.Close();
                fout.Close();
                fin.Close();
            }
            catch ( System.Exception error )
            {
                throw ( error );
            }
        }
        /// <summary>
        /// 使用系统默认的密钥解密文件
        /// </summary>
        /// <param name="m_InFilePath"></param>
        /// <param name="m_OutFilePath"></param>
        public static void DesEncryptFile( string m_InFilePath , string m_OutFilePath )
        {
            DesEncryptFile( m_InFilePath , m_OutFilePath , ENCRKEY );
        }
        /// <summary>
        /// 解密文件
        /// </summary>
        /// <param name="m_InFilePath">欲解密文件的路径</param>
        /// <param name="m_OutFilePath">输出文件路径</param>
        /// <param name="sDecrKey">密钥（8位）</param>
        public static void DesDecryptFile( string m_InFilePath , string m_OutFilePath , string sDecrKey )
        {
            byte[] byKey = null;
            byte[] IV = { 0x12 , 0x34 , 0x56 , 0x78 , 0x90 , 0xAB , 0xCD , 0xEF };
            try
            {
                byKey = System.Text.Encoding.UTF8.GetBytes( sDecrKey.Substring( 0 , 8 ) );
                FileStream fin = new FileStream( m_InFilePath , FileMode.Open , FileAccess.Read );
                FileStream fout = new FileStream( m_OutFilePath , FileMode.OpenOrCreate , FileAccess.Write );
                fout.SetLength( 0 );
                //Create variables to help with read and write.
                byte[] bin = new byte[100]; //This is intermediate storage for the encryption.
                long rdlen = 0; //This is the total number of bytes written.
                long totlen = fin.Length; //This is the total length of the input file.
                int len; //This is the number of bytes to be written at a time.

                DES des = new DESCryptoServiceProvider();
                CryptoStream encStream = new CryptoStream( fout , des.CreateDecryptor( byKey , IV ) , CryptoStreamMode.Write );


                //Read from the input file, then encrypt and write to the output file.
                while ( rdlen < totlen )
                {
                    len = fin.Read( bin , 0 , 100 );
                    encStream.Write( bin , 0 , len );
                    rdlen = rdlen + len;
                }

                encStream.Close();
                fout.Close();
                fin.Close();

            }
            catch ( System.Exception error )
            {
                throw ( error );
            }
        }
        /// <summary>
        /// 使用系统默认的密钥解密通过此默认密钥加密的文件
        /// </summary>
        /// <param name="m_InFilePath"></param>
        /// <param name="m_OutFilePath"></param>
        public static void DesDecryptFile( string m_InFilePath , string m_OutFilePath )
        {
            DesDecryptFile( m_InFilePath , m_OutFilePath , ENCRKEY );
        }
        #endregion 加密解密文件

        #region 其他加密方法
        /// <summary>
        /// <see cref="System.Security.Cryptography.MD5">MD5</see>加密
        /// <seealso cref="System.Security.Cryptography.MD5"/>
        /// </summary>
        /// <param name="strText">欲加密的字符串</param>
        /// <returns><see cref="System.Security.Cryptography.MD5">MD5</see>加密后的字符串</returns>
        public static string MD5Encrypt( string strText )
        {
            MD5 md5 = new MD5CryptoServiceProvider();
            byte[] result = md5.ComputeHash( System.Text.Encoding.UTF8.GetBytes( strText ) );
            return Convert.ToBase64String( result );
            //return System.Text.Encoding.Default.GetString(result);
        }
        #endregion 其他加密方法
        #endregion 方法
    }
}